#include "log.h"
#include <stdlib.h>
#include <errno.h>
#include "Sesion.h"
#include "MensajeroTCP.h"
#include "tcp.h"
#include <vector>
#include "mensajes/Mensaje.h"
#include "ListaUsuarios.h"

#define EXIT_ERROR_PARAMETROS 1

void crearEmisor(long idUsuario, const char* host){
    log(stdout, "Lanzo un proceso emisor para el usuario %ld (host: %s)\n", idUsuario, host);

    if(fork() == 0){
	char usuario[20];
	sprintf(usuario, "%ld", idUsuario);
	execlp("./emisor", "emisor", usuario, host, NULL);
	perror("No se pudo lanzar el emisor");
	exit(-1);
    }
}

int main(int argc, char *argv[]){

    if(argc < 2) {
	log(stdout, "%s <numero_usuario> sockfd", argv[0]);
	exit(EXIT_ERROR_PARAMETROS);
    }

    long idUsuario = atoi(argv[1]);
    int sockfd = atoi(argv[2]);

    if(sockfd <= 0){
    	log(stdout, "Error, el socket no puede ser %d.\n", sockfd);
    	exit(-1);
    }

    log(stdout, "Inicio del controlador.\n");

    Sesion sesion;
    sesion.recuperar(idUsuario);

    MensajeroTCP mensajero(sockfd);
    MensajeSYNC sync;
    ListaUsuarios listaUsuarios;
    listaUsuarios.clear();
    
    log(stdout, "Envio mensaje de sincronizacion.\n");
    
    sync.idUsuario = idUsuario;
    mensajero.enviarMensaje((const char*)&sync, sizeof(MensajeSYNC));
    std::vector<char> buffer;
    
    while(mensajero.recibirMensaje(buffer)){
	MensajeControl *control;
	control = (MensajeControl*)&buffer[0];
	if(control->good()){

	    log(stdout, "Recibido mensaje de control\n");
	    log(stdout, "Usuario: %ld , conversacion: %ld, host: %s\n", control->idUsuario, control->idConversacion, control->host);

	    //Agrego/saco al usuario a la lista de participantes de la conversacion
	    ListaCompartida<long> participantes(FTOK_PATH, LISTA_COMPARTIDA_CONVERSACION_BASE+control->idConversacion);

	    if(control->esConexion()){
		Usuario nuevoUsuario(control->idUsuario, control->nombreUsuario, control->host);
		listaUsuarios.agregarUsuario(nuevoUsuario);
		participantes.agregarElemento(control->idUsuario);
		crearEmisor(control->idUsuario, control->host);
	    }
	    else{
		listaUsuarios.eliminarUsuario(control->idUsuario);
		participantes.eliminarElemento(control->idUsuario);
	    }


	}
	else
	    log(stdout, "Mensaje desconocido.\n");
    }

    log(stdout, "%d: Proceso control sale.\n",getpid());
    sleep(10);

    return 0;
}
